package com.xiaoxx.rabbitmq;

import javax.annotation.Resource;

/**
 * 使用方式说明
 */
public class DemoExample {


    /* >>>>>>>>>>>>>>>> 消息发送 <<<<<<<<<<<<<<< */
    /**
     * 可发送3中类型的消息
     * 1.  迅速消息：会做confirm确认 不做消息路由失败回退  使用场景:日志
     * 2.  确认消息：会做confirm确认 会做消息路由失败回退 (发往延时队列(delay.开头的队列)的消息无法做confirm确认) 使用场景:可接受微小概率丢失(可通过日志找回消息)
     * 3.  可靠性消息： 会做confirm确认 会做消息路由失败回退 会做消息入库跟踪 使用场景: 保证不丢失(会在数据库内记录每条消息 慎用)
     */

    @Resource
    private IRabbitMQMessageClient producerClient;


    // @GetMapping(value = {"/test1"})
    // @ApiOperation(value = "延时消息发送", notes = "msgType: 0快速消息; 1确认消息; 2可靠消息 ")
    // public R<String> test1(String exchange, String routingKey, String msgType) {
    //     MyMessage myMessage = new MyMessage(UUID.randomUUID().toString(),
    //             exchange,
    //             routingKey,
    //             "延时消息 延时5秒" + LocalDateTime.now(),
    //             5,  // 延时时间 单位秒
    //             MessageType.CONFIRM);
    //     producerClient.send(myMessage);
    //     return R.data("发送成功");
    // }
    //
    // @GetMapping(value = {"/test2"})
    // @ApiOperation(value = "通用消息发送", notes = "msgType: 0快速消息; 1确认消息; 2可靠消息 ")
    // public R<String> test2(String exchange, String routingKey, String msgType) {
    //     ApiScope apiScope = new ApiScope();
    //     apiScope.setScopeName("测试测试");
    //     MyMessage<ApiScope> myMessage = new MyMessage<>(UUID.randomUUID().toString(),
    //             RabbitQueueExchangeConstant.ExchangeName.ORDER_TENANT_DEDUCTION,
    // 			   RabbitQueueExchangeConstant.RoutingKey.ORDER_TENANT_DEDUCTION,
    //             apiScope,
    //             msgType);
    //     producerClient.send(myMessage);
    //     return R.data("发送成功");
    // }

    /* >>>>>>>>>>>>>>>> 消息消费 <<<<<<<<<<<<<<< */

    /**
     * 普通队列声明 队列/交换机/路由key 必须在 RabbitQueueExchangeConstant 类中声明
     * ackMode NONE:没有 AUTO:自动签收(未捕获的异常不会签收) MANUAL:手动签收
     */

    // @RabbitListener(bindings = @QueueBinding(
    //         value = @Queue(value = "test", durable = "true", autoDelete = "false"), // durable: 是否消息持久化  false 声明后是否一直存在(false时断开连接会销毁)
    //         exchange = @Exchange(value = "test", durable = "true"),
    //         key = "test"),
    //         ackMode = "MANUAL", concurrency = "1-10") // ackMode 签收方式(看需求)  concurrency: 并发消费者数量(可以设置值为 1-10 )
    // public void test(MyMessage<你的数据> message, @Header(AmqpHeaders.DELIVERY_TAG) long deliveryTag, Channel channel) {
    //     try {
    //         log.info("接受到测试消息：{} 时间：{}", JsonUtil.toJson(message), LocalDateTime.now());
    //         channel.basicAck(deliveryTag, false);
    //     } catch (Exception e) {
    //         try {
    //             channel.basicRecover();
    //         } catch (IOException e1) {
    //             e1.printStackTrace();
    //         }
    //     }
    // }


    /**
     * 延时队列声明
     */
//     @RabbitListener(bindings = @QueueBinding(
//             value = @Queue(value = RabbitQueueExchangeConstant.QueueName.XXX, durable = "true", autoDelete = "false"),
//             exchange = @Exchange(
//                     value = RabbitQueueExchangeConstant.ExchangeName.XXX,
//                     type = "x-delayed-message", durable = "true",
//                     arguments = {@Argument(name = "x-delayed-type", value = "direct")}
//             ),
//             key = RabbitQueueExchangeConstant.RoutingKey.XXX),
//             ackMode = "MANUAL", concurrency = "1")
//     public void orderAmountRecord(MyMessage message, @Header(AmqpHeaders.DELIVERY_TAG) long deliveryTag, Channel channel) {
//         try {
//             log.info("接受到测试消息：{} 时间：{}", JsonUtil.toJson(message), LocalDateTime.now());
//             channel.basicAck(deliveryTag, false);
//         } catch (Exception e) {
//             try {
//                 channel.basicRecover();
//             } catch (IOException e1) {
//                 e1.printStackTrace();
//             }
//         }
//     }
}
